package 小数精确运算Bigdicime;

import java.math.BigDecimal;
import java.math.RoundingMode;

//小数,运算结果可能会产生小数（除法）精确运算  Bigdecimal对象
public class Bigdecimatext1 {
    public static void main(String[] args) {
        //直接用小数计算，结果可能不精确
        System.out.println(0.01 + 0.09);
        System.out.println(0.199 - 0.1);
        System.out.println(0.226 * 0.01);
        System.out.println(0.09 / 0.1);

        System.out.println("---------------------------------");
        //解决方法
        //1.通过传递double类型的小数来创建对象
        //细节：
        //这种方式有可能是不精确的，所以不建议使用
        double a = 0.1;
        double a2 = 0.111;
        BigDecimal b1 = new BigDecimal(0.1);
        BigDecimal b2 = new BigDecimal(0.111);
        System.out.println(b1);
        System.out.println(b2);
        System.out.println(a);
        System.out.println(a2);
        System.out.println("---------------------------------");

        //2.通过传递字符串表示的小数来创建对象(建议)
        BigDecimal b3 = new BigDecimal("0.1");
        BigDecimal b4 = new BigDecimal("0.111");
        System.out.println(b3);
        System.out.println(b4);
        System.out.println("---------------------------------");
        //3，通过静态方法传递对象,注意0-10的整数是该对象预先创建好的，
        // 赋值为0-10的时候，==为true（数据的长度不超过Double的长度是，建议用静态方法传值）
        BigDecimal d1 = BigDecimal.valueOf(3);
        BigDecimal d2 = BigDecimal.valueOf(2);
        BigDecimal d3 = BigDecimal.valueOf(2);
        //打上断点（点击这一行的行数，如39，再右键“Debug”，点击向下的箭头，
        // 直到该行代码后面出现 d4 "2.0"） 点击可以查看每一位数的ascll码，即“2”，".","0"
        BigDecimal d4 = BigDecimal.valueOf(2.0);
        BigDecimal d5 = BigDecimal.valueOf(10);
        BigDecimal d6 = BigDecimal.valueOf(11);
        BigDecimal d7 = BigDecimal.valueOf(11);

        System.out.println(d3 == d2);//true
        System.out.println(d3 == d4);//false
        System.out.println(d6 == d7);//false，非0-10的数都是new出来的，所以地址值不一样
        System.out.println("---------------------------------");

        //该方法的计算方法
        BigDecimal b5 = b1.add(b2);
        System.out.println(b5);
        //加法
        BigDecimal b6 = b3.add(b4);//b3+b4=b6
        System.out.println(b6);
        //减法
        BigDecimal b7 = d1.subtract(d2);
        System.out.println(b7);
        //乘法
        BigDecimal b8 = d1.multiply(d2);
        System.out.println(b8);

        //除法
        //第一种，除的尽的数，3/2
        BigDecimal b9 = d1.divide(d2);
        System.out.println(b9);
        //第二种，除不尽的数,10/3
//        (除数，小数点后保留的位数，精确方法），
//      RoundingMode.HALF_UP：是四舍五入的精确方法
/*      UP：远离零方向舍入的舍入模式
        DOWN：向零方向舍入的舍入模式
        CE旧NG：向正无限大方向舍入的舍入模式
        FLOOR：向负无限大方向舍入的舍入模式
        */
        BigDecimal b10 = d5.divide(d1, 2, RoundingMode.HALF_UP);
        BigDecimal b11 = d5.divide(d1);
        System.out.println(b10);
//        System.out.println(b11);//10/3除不尽，所以报错

    }
}
